L’analyse factorielle est un terme générique pour une famille d’analyse :
« Elle permet d’extraire le maximum d’information sous une forme simple et cohérente à partir d’un ensemble très important de données et sert à mettre en évidence les interrelations entre les variables et les ressemblances et oppositions entre les unités géographiques analysées. »
Sanders L., 1989, L’analyse statistique des données en géographie, p.17
Les analyses factorielles permettent de traiter des masses importantes de données (= nombre élevé de variables), qui nécessitent une synthèse des données, par deux opérations :
A retenir :
Les données doivent être quantitatives et exprimées :
Si les données sont exprimées dans une même unité (ex : % ou indice) :
« La direction de l’axe d’allongement maximum du nuage de points est celle du vecteur propre de la matrice des corrélations associée à sa plus grande valeur propre » .
Sanders L., 1989, p28
Les résultats d’une ACP sont de 4 types :
Les facteurs sont caractérisés par :
Leur valeur propre (eigenvalues) Elle correspond à la variance (le taux d’inertie) du nuage de points surcet axe. Elle est interprétable comme la variance relative (part dans la variance totale), c’est-à -dire la part d’information observable sur cet axe; Plus elle est élevée, plus le facteur « porte » d’informations.
Leur part de variance et leur pourcentage cumulé
La part de variance totale prise en compte par un facteur est en effet définie comme le rapport entre la valeur propre qui caractérise le facteur et la somme des valeurs propres;
Les coordonnées de variables :
Les coordonnées des individus :
Les contributions (CTR) des variables/individus aux axes factoriels :
La qualité (QLT ou Cos2) de représentation d’une variable sur un axe factoriel :
Pour les individus :
library(dplyr)
library(ggplot2)
library(scales)
library(tidyr)
library(ade4)ade4str(iris)'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
donneesExemple <- iris %>% select(-Species)
acpExemple <- dudi.pca(df = donneesExemple, center = TRUE, scale = TRUE, scannf = FALSE,
nf = ncol(donneesExemple))ggplot2vPropres <- data_frame(Composante = 1:length(acpExemple$eig), VP = acpExemple$eig,
VAR = VP/sum(VP), CUMVAR = cumsum(VAR))
ggplot(vPropres) + geom_bar(aes(x = factor(Composante), VAR), stat = "identity",
fill = "grey") + geom_point(aes(x = Composante, y = CUMVAR)) + geom_line(aes(x = Composante,
y = CUMVAR)) + scale_x_discrete(name = "Composante Principale") + scale_y_continuous(name = "Part de la variance totale",
labels = percent) + theme_bw()ade4s.corcircle(acpExemple$co)ggplot2coordsVar <- as_data_frame(acpExemple$co) %>% mutate(VAR = row.names(acpExemple$co))
ggplot(coordsVar, aes(x = Comp1, y = Comp2)) + geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) + geom_segment(x = 0, y = 0, aes(xend = Comp1,
yend = Comp2)) + geom_label(aes(label = VAR), alpha = 0.5) + scale_x_continuous(limits = c(-1,
1)) + scale_y_continuous(limits = c(-1, 1)) + coord_fixed()ggplot2coordsIndiv <- as_data_frame(acpExemple$li)
ggplot(coordsIndiv, aes(Axis1, Axis2)) + geom_point() + geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) + coord_fixed()Ajout d’une variable descriptive
coordsIndiv$Species <- iris$Species
ggplot(coordsIndiv, aes(Axis1, Axis2, group = Species, col = Species)) + geom_point() +
stat_ellipse() + geom_hline(yintercept = 0) + geom_vline(xintercept = 0) +
coord_fixed()contribs <- inertia.dudi(acpExemple, row.inertia = TRUE, col.inertia = TRUE)
contribVar <- as_data_frame(contribs$col.abs) %>% mutate(Var = row.names(contribs$col.abs))
contribVarLong <- contribVar %>% gather(key = Axis, value = Value, -Var) %>%
mutate(Value = Value/10000)ggplot(contribVarLong, aes(Axis, Value, fill = Var)) + geom_bar(stat = "identity") +
scale_y_continuous(labels = percent)ctrIndiv <- as_data_frame(contribs$row.abs/10000)
colnames(ctrIndiv) <- paste("CTR", colnames(ctrIndiv), sep = "")
coordsIndiv <- coordsIndiv %>% cbind(ctrIndiv)
ggplot(coordsIndiv, aes(Axis1, Axis2, size = CTRAxis1)) + geom_point() + geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) + coord_fixed()On repart de la variable contribs qui contient aussi cette information
qltVar <- as_data_frame(contribs$col.rel) %>% mutate(Var = row.names(contribs$col.rel)) %>%
select(-con.tra)
qltVarLong <- qltVar %>% gather(key = Axis, value = Value, -Var) %>% mutate(Value = Value/10000)ggplot(qltVarLong, aes(factor(Axis), Value, fill = Axis)) + geom_bar(stat = "identity",
position = "dodge") + facet_wrap(~Var) + scale_y_continuous(labels = percent)qltIndiv <- as_data_frame(contribs$row.rel/10000)
colnames(qltIndiv) <- paste("QLT", colnames(qltIndiv), sep = "")
coordsIndiv <- coordsIndiv %>% cbind(qltIndiv)ggplot(coordsIndiv, aes(Axis1, Axis2, col = QLTAxis1)) + geom_point() + geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) + scale_colour_gradient2(low = "navyblue", mid = "white",
high = "firebrick3") + coord_fixed()tabSocial, qui contient des variables sociales structurelles sur votre aire d’étude.library(cartography)
times100 <- function(x) {
x * 100
}
tabSocialPct <- tabSocial %>% mutate_each(funs(times100), -COMMUNE)
choroLayer(spdf = toulCom, df = tabSocialPct, spdfid = "INSEE_COM", dfid = "COMMUNE",
var = "txRETRAITES", method = "quantile", nclass = 5)